{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 泰坦尼克号生存预测（上）——LR\n",
    "\n",
    "作者：maxmon\n",
    "\n",
    "官网：[www.abuquant.com](http://www.abuquant.com)\n",
    "\n",
    "阿布量化版权所有 未经允许 禁止转载\n",
    "\n",
    "> TAG: Machine Learning, 机器学习, LR, 逻辑回归, 逻辑分类, 泰坦尼克号, Logistic Regression, Logistic Classification, 线性模型\n",
    "\n",
    "____\n",
    "\n",
    "LR是一种线性模型\n",
    "\n",
    "- LR：逻辑分类模型(Logistic Classification)，用于分类预测\n",
    "- LR：线性回归模型(Linear Regression)，用于回归预测"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 环境\n",
    "\n",
    "- [Anaconda主页](https://www.anaconda.com/download/) 下载终端运行Anaconda脚本\n",
    "- [abupy量化系统主页](https://github.com/bbfamily/abu) 终端运行`pip install abupy`\n",
    "- [泰坦尼克号数据集](https://github.com/maxmon/abu_ml/tree/master/ipython/data/titanic)下载数据集，为了实验方便，我们只选择train.csv作为全部实验数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 泰坦尼克号生存预测\n",
    "\n",
    "> 泰坦尼克号的沉没是历史上最臭名昭著的沉船之一。 1912年4月15日，在它的首航中，泰坦尼克号在与冰山撞击后沉没，在2224名乘客和船员中丧生1502人。 这一耸人听闻的悲剧震撼了国际社会，并为船舶制定了更好的安全条例。海难导致这种生命损失的原因之一是乘客和船员没有足够的救生艇。 虽然有一些运气涉及幸存下沉，一些人群比其他人更可能生存，如妇女，儿童和上层阶级。\n",
    "    \n",
    "![](img/1/4/titanic.jpg)\n",
    "\n",
    "在这个例子中，我们的任务是完成对什么样的人可能生存的分析，应用机器学习的工具来预测哪些乘客幸免于悲剧。\n",
    "\n",
    "#### 任务描述：\n",
    "\n",
    "- 样本数：891名乘客信息（小数据集）\n",
    "- 原始特征数：11\n",
    "    - PassengerId：乘客id\n",
    "    - Pclass：几等舱(1 = 一等舱，2 = 二等舱，3 = 三等舱)\n",
    "    - Name：名字\n",
    "    - Sex：性别\n",
    "    - Age：年龄\n",
    "    - SibSp：兄弟姐妹/配偶的数量\n",
    "    - Parch：父母/孩子的数量\n",
    "    - Ticket：机票号码\n",
    "    - Fare：票价\n",
    "    - Cabin：客舱\n",
    "    - Embarked：登船的港口（C = 瑟堡，Q = 皇后镇，S = 南安普顿）\n",
    "- 目标：预测Survived（1 = 生存，0 = 死亡）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 课题A：理解LR\n",
    "\n",
    "**把每个特征对分类结果的“作用”加起来——这就是线性模型**。\n",
    "\n",
    "LR可以作为逻辑分类(Logistic Classification)或者线性回归(Linear Regression)的简称。\n",
    "\n",
    "逻辑分类（Logistic Classification）是一种线性模型，模型对特征数据的核心表达式为：$y = w \\cdot x + b$。需要说明的是有些资料中逻辑分类也叫作逻辑回归(Logistic Regression)，但它本身是用作分类问题的。\n",
    "\n",
    "使用模型分为**模型训练和模型预测**两个环节。工程角度，可以通过输入输出的方式理解模型，模型训练为：\n",
    "\n",
    "$$\\text{数据X + 标签y} \\to \\text{模型(w, b)}$$\n",
    "\n",
    "而模型预测可以理解为：\n",
    "\n",
    "$$\\text{数据X + 模型(w, b)} \\to \\text{标签y}$$\n",
    "\n",
    "只要是可导的模型表达式，都可以使用梯度下降训练，这里不用再多说。\n",
    "\n",
    "逻辑分类模型预测一个样本分为三步：\n",
    "\n",
    "1. 计算线性函数\n",
    "2. 从分数到概率的转换\n",
    "3. 从概率到标签的转换\n",
    "\n",
    "而回归问题预测一个样本时只有第一步。\n",
    "\n",
    "![](./img/lr_total.jpeg)\n",
    "\n",
    "\n",
    "也就是说，**很多同一思路设计的模型稍作修改可以生成两种模型，分别用于分类和回归两种问题**。他们的设计区别仅仅在于：\n",
    "\n",
    "- 模型输出没有作概率映射\n",
    "- 损失函数的区别\n",
    "- 评估体系的区别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 课题B：使用LR\n",
    "\n",
    "这一实验案例旨在介绍使用LR模型时的一些数据、特征的处理技巧。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 第一步：观察数据集\n",
    "\n",
    "下文出于实验方便的目的，我们将忽视数据集的test.csv，直接在train.csv分割训练-测试集，显式观测成绩。\n",
    "\n",
    "关心的要点有这么几个：\n",
    "\n",
    "- 采集的样本是否有缺失数据\n",
    "- 不同类别的样本数量分布是否基本均匀"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd # pandas是python的数据格式处理类库\n",
    "\n",
    "# 加载泰坦尼克号生存预测数据集\n",
    "data_train = pd.read_csv(\"../data/titanic/train.csv\")\n",
    "data_train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Survived</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>424</td>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>549</td>\n",
       "      <td>68</td>\n",
       "      <td>549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>290</td>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>342</td>\n",
       "      <td>136</td>\n",
       "      <td>340</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          PassengerId  Pclass  Name  Sex  Age  SibSp  Parch  Ticket  Fare  \\\n",
       "Survived                                                                    \n",
       "0                 549     549   549  549  424    549    549     549   549   \n",
       "1                 342     342   342  342  290    342    342     342   342   \n",
       "\n",
       "          Cabin  Embarked  \n",
       "Survived                   \n",
       "0            68       549  \n",
       "1           136       340  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_train.groupby('Survived').count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，样本类别比例549:342，略不均衡，但差距不大。同时注意到“Age”、“Cabin”、“Embarked”维度的数据有缺失，在开始模型训练之前，我们需要处理这一情况。\n",
    "\n",
    "### 第二步：特征数据预处理\n",
    "\n",
    "这里要处理特征的输入数据，使其适合模型去训练。\n",
    "\n",
    "首先，观察并挑选特征。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_train.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "“Survived”是生存预测的数据标签。特征“PassengerId”、“Ticket”、“Name”维度下的数据基本是完全随机的，这些特征应该和任务的目标生存预测不相关。\n",
    "\n",
    "#### 两类特征\n",
    "\n",
    "剩下的输入特征分为两类：一类是有**数值**意义的数据，如：年龄“Age”、票价“Fare”、兄弟姐妹/配偶的数量“SibSp”、父母/孩子的数量“Parch”；另一类是有**类别**意义的数据，比如几等舱“Pclass”、性别“Sex”、登船港口“Embarked”、客舱“Cabin”，这种特征下的数值是没有数量意义的，如特征“Pclass”（几等舱）下的样本数值：“1”和“3”，并不是表示数量或者长度的3倍关系，而仅仅类别标号。\n",
    "\n",
    "当两种数据同时流入模型时，模型并不知道哪些是数量意义的数值，哪些是类别意义的数值，所以我们需要把这两类特征需要分开处理一下。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 处理数值型数据的缺失\n",
    "\n",
    "先处理“数值”意义的特征数据，第一个问题是“Age”的数据缺失。补全缺失数据的唯一要点就是：**尽量保持原始信息状态**。处理手段视情况而定，总共这么几种：\n",
    "\n",
    "- 扔掉缺失数据\n",
    "- 按某个统计量补全；统计量可以是定值、均值、中位数等\n",
    "- 拿模型预测缺失值\n",
    "\n",
    "对于大数据集的小比例缺失，可以直接扔掉这部分数据样本，因为样本充分，信息不会损失多少。但泰坦尼克号数据样本总共891条，而且可以直观的猜到，“年龄”这一特征非常影响样本是否在灾难中存活，，所以我们希望补全这部分信息而不是丢弃。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n"
     ]
    }
   ],
   "source": [
    "data_train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "“年龄”特征缺失约20%，**可以通过一些统计图形直观观察数据分布**，如下面拿使用计直方图观察原始数据分布："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x113e6ff90>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113e6f950>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import seaborn as sns # seaborn包含了一系列的统计图形函数\n",
    "\n",
    "sns.distplot(data_train[\"Age\"].dropna(), kde=True, hist=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图中，直方图的横轴是年龄的数值，每个直方块的宽度(bins)代表在一个年龄范围，如Age：0-5这样。纵轴是归一化以后的数量(即该区域的样本数量除以总数)，直方块就是统计样本落在每个区间的数量比例。\n",
    "\n",
    "按均值函数填充后，观察分布："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x10f678950>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n8QcNR0wQ43NE/QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10f678f10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def set_missing_ages(p_df):\n",
    "    \"\"\"均值特征填充\"\"\"\n",
    "    p_df.loc[(p_df.Age.isnull()), 'Age'] = data_train.Age.dropna().mean()\n",
    "    return p_df\n",
    "\n",
    "data_train = set_missing_ages(data_train)\n",
    "data_train_fix1 = set_missing_ages(data_train)\n",
    "sns.distplot(data_train_fix1[\"Age\"], kde=True, hist=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们无视了数据内在的联系，直接用均值补充数据，这种拍脑袋的做法自然不合理，统计的拟合曲线明显变形了。于是，下面取出一些感觉上和“年龄”相关的特征，比如船票、家庭成员数量等，扔进线性回归模型中，通过模型预测年龄看看："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x114fc03d0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhUAAAF9CAYAAACzq5rUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl83Gdh7/vPLNpGo9G+e5HXx0tM4mx2ErJQ2rA0KW0o\nKZRbcoBDCzSHS+H25N5z2kvPpefyupTl1XJYSjmnbegGBGgKKTQlgUAWJ7ET27EdP15kedNiSaN9\nRrPfP34zsixL1ow00mj5vl8vvaz5zaOfHj2e5Tu/Z3OlUilERERE5std6AqIiIjIyqBQISIiInmh\nUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ54c31B4wxJcBX\ngAeAEPB5a+0XZii7G/gqsAs4AnzEWvvKpPt/E/jvQCvwLPC71tpzudZJRERECm8uVyo+B9wI3AN8\nFPiUMeaBqYWMMT7gCeCZdPkXgCeMMWXp+28H/gH4M2A3EAX+aQ71ERERkSUgp1CRDgofBD5mrT1k\nrX0c+Czw8DTF3w2ErLWPWMfHgRHgXen7Pwk8aq39hrX2JPAxoMkYUzPXP0ZEREQKJ9fuj+vTP/PC\npGPPAv9lmrJ70vdN9hxwG/AozpWO92XusNZ2ABtzrI+IiIgsEbl2fzQDfdba+KRjPUCpMaZ2mrKd\nU471AGuMMZVANVBkjPmxMabLGPPPxpiWHOsjIiIiS0SuocIHRKYcy9wuybJsCeBP3/5znKsW96WP\n/zDH+oiIiMgSkWv3xzhXh4fM7VCWZUNA5krHX1lr/wHAGPNeoMcYs9dauy+byqRSqZTL5cq27iIi\nInJZ3t9Acw0VF4E6Y4zbWptMH2sCwtbawWnKNk051gR0AX1ADLCZO6y1QWNMP7AWyCpUuFwuhofD\nJBLJ2QsLHo+bQKBMbZYjtVvu1GZzo3bLndpsbjLtlm+5hoqDOGFgL/B8+tidwMvTlN0HPDLl2B3A\np621CWPMAZyBn98BMMbUAXVARy4VSiSSxON6IOVCbTY3arfcqc3mRu2WO7XZ0pBTqLDWho0xjwJf\nM8Z8AFiDMzX0IQBjTCMwZK0dBx4DPmOM+SLwdeDDOOMsvpM+3eeBvzbGHASO4kxNfcVaO11AERER\nkSVuLotffQI4ADwNfAn44/R6FeB0bTwIYK0dwRmAeRewH7gVeJu1Npy+/7vAH+AsfpUJEr8+tz9D\nRERECs2VSqUKXYf5SA0MjOmSV5a8XjfV1eWozXKjdsud2mxu1G65U5vNTbrd8j5QUxuKiYiISF4o\nVIiIiEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSIiIhIXihU\niIiISF4oVIiIiEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSI\niIhIXihUiIiISF4oVIiIiEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSIiIhIXihUiIiISF4oVIiI\niEheKFSIiIhIXihUiIiISF4oVIiIiEheKFSIiIhIXngLXQGR1SaZTBIMBrMuX1NTg9ut/C8iS59C\nhcgiCwaDPLnvOH5/5axlR0eHuHfvNurq6hahZiIi86NQIVIAfn8lgaqaQldDRCSvdE1VRERE8kKh\nQkRERPJCoUJERETyQqFCRERE8kKhQkRERPJCoUJERETyQqFCRERE8iLndSqMMSXAV4AHgBDweWvt\nF2Youxv4KrALOAJ8xFr7yqT7B4EKwJU+lAIqrLWhXOslIiIihTWXKxWfA24E7gE+CnzKGPPA1ELG\nGB/wBPBMuvwLwBPGmLL0/S04gWIj0JT+alagEBERWZ5yulKRDgofBN5irT0EHDLGfBZ4GPjelOLv\nBkLW2kfStz9ujHk78C7gUWA70GWtPTufP0BERESWhlyvVFyPE0RemHTsWWDPNGX3pO+b7DngtvT3\nO4ATOf5+ERERWaJyDRXNQJ+1Nj7pWA9QaoypnaZs55RjPcCa9PfbgXJjzE+NMZ3GmCeMMVtyrI+I\niIgsEbkO1PQBkSnHMrdLsiybKbcNqAb+T2Ak/e9Txpjt1tqxbCvk8WgCS7YybaU2y02+283rdeF2\nu/C4XbOWdbtdeL0uvN7l9X+mx9rcqN1ypzabm4Vqr1xDxThXh4fM7akDLGcqmyn3FqAoMzDTGPNe\n4DxwP/BP2VYoECjLtqikqc3mJl/tFo+HKCsrxueb+vS4WjRSTFVVOdXV5Xn53YtNj7W5UbvlTm22\nNOQaKi4CdcYYt7U2mT7WBISttYPTlG2acqwJ6AKw1saAWOYOa23EGHMGaM2lQsPDYRKJ5OwFBY/H\nTSBQpjbLUb7bbXBwjHA4SnHJ1At5VwuHowwOjuH1+ub9exeTHmtzo3bLndpsbjLtlm+5hoqDOEFg\nL/B8+tidwMvTlN0HPDLl2B3ApwGMMaeA/8da+2j6djmwBTieS4USiSTxuB5IuVCbzU2+2i0eT5FM\npkgkU7OWTSZTxOOpZfv/pcfa3Kjdcqc2WxpyChXW2rAx5lHga8aYD+AMuvwk8BCAMaYRGLLWjgOP\nAZ8xxnwR+DrwYZxxFt9Jn+4J4L8ZY84CfThh4xzwr/P+q0RERGTRzWWkxieAA8DTwJeAP7bWPp6+\nrwt4EMBaOwLcB9wF7AduBd5mrQ2ny/4hTvD4e5yrGm7gV621s398ExERkSUn52W606Hg/emvqfe5\np9zeD9w0w3miOMHiD3Otg4iIiCw9moMjIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmh\nUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQ\nISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAh\nIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEi\nIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ5oVAhIiIieaFQISIiInmhUCEiIiJ54S10BUTkstFQjIt9\no5QWe1nfVFHo6oiI5EShQqTAUqkUr3cMcLpzmIGRyMTxe3a3UFVSwIqJiORI3R8iBfZ6xwD7be8V\ngQLgxWOXiMWTBaqViEjucr5SYYwpAb4CPACEgM9ba78wQ9ndwFeBXcAR4CPW2lemKfcu4FvWWoUc\nWVVi8SSvtQcBqPAVsX19NR6PmxeOdBOOxDl2foy7byhwJUVEsjSXN/HPATcC9wAfBT5ljHlgaiFj\njA94AngmXf4F4AljTNmUcpXAXwCpOdRFZFl7/ewAkVgCgNt2NrFtfTVb1lROjKc40zPO2Z6xQlZR\nRCRrOYWKdFD4IPAxa+0ha+3jwGeBh6cp/m4gZK19xDo+DowA75pS7s+Ak7lXXWR5i8YSHDvjXKVo\nqvHRVOubuO+WbQ0UeZ2n53efvUg8oW4QEVn6cr1ScT1Ol8kLk449C+yZpuye9H2TPQfclrlhjLkb\nuBv47znWQ2TZO9YxQDQ9ZuKGLXVX3Ocr9XKTqQege2CcF4/1LHr9RERylWuoaAb6rLXxScd6gFJj\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x114f16490>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from abupy import AbuML\n",
    "import sklearn.preprocessing as preprocessing\n",
    "\n",
    "def set_missing_ages2(p_df):\n",
    "    \"\"\"回归模型预测特征填充\"\"\"\n",
    "    age_df = p_df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]\n",
    "    # 归一化\n",
    "    scaler = preprocessing.StandardScaler()\n",
    "    fare_scale_param = scaler.fit(age_df['Fare'].reshape(-1, 1))\n",
    "    age_df['Fare_scaled'] = scaler.fit_transform(age_df['Fare'].reshape(-1, 1), fare_scale_param)\n",
    "    del age_df['Fare']\n",
    "    # 分割已经数据和待预测数据集\n",
    "    known_age = age_df[age_df.Age.notnull()].as_matrix()\n",
    "    unknown_age = age_df[age_df.Age.isnull()].as_matrix()\n",
    "    y_inner = known_age[:, 0]\n",
    "    x_inner = known_age[:, 1:]\n",
    "    # 训练\n",
    "    rfr_inner = AbuML(x_inner, y_inner, age_df.Age.notnull())\n",
    "    rfr_inner.estimator.polynomial_regression(degree=1)\n",
    "    reg_inner = rfr_inner.fit()\n",
    "    # 预测\n",
    "    predicted_ages = reg_inner.predict(unknown_age[:, 1::])\n",
    "    p_df.loc[(p_df.Age.isnull()), 'Age'] = predicted_ages\n",
    "    return p_df\n",
    "\n",
    "data_train = pd.read_csv('../data/titanic/train.csv')\n",
    "data_train_fix2 = set_missing_ages2(data_train)\n",
    "sns.distplot(data_train_fix2[\"Age\"], kde=True, hist=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面直观对比下在最后的模型中，使用不同的数据填充方式造成的成绩对比："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "accuracy mean: 0.798073714675\n"
     ]
    }
   ],
   "source": [
    "data_train_fix1 = set_cabin_type(data_train_fix1)\n",
    "train_val(data_train_fix1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用 set_missing_ages2 ，回归模型预测填充的模型成绩："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "accuracy mean: 0.809183974577\n"
     ]
    }
   ],
   "source": [
    "data_train_fix2 = set_cabin_type(data_train_fix2)\n",
    "train_val(data_train_fix2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 归一化数值数据\n",
    "\n",
    "对于两类特征数据混杂的问题，我们可以看到，票价“Fare”、年龄“Age”这两个数值特征和其它特征明显不在同一可以比较的尺度上。在使用梯度下降训练模型时，往往希望所有的输入数据在差不多同一尺度上可比较，所以下面归一化这两个维度的数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import sklearn.preprocessing as preprocessing\n",
    "\n",
    "scaler = preprocessing.StandardScaler()\n",
    "age_scale_param = scaler.fit(data_train['Age'].reshape(-1, 1))\n",
    "df['Age_scaled'] = scaler.fit_transform(data_train['Age'].reshape(-1, 1), age_scale_param)\n",
    "\n",
    "fare_scale_param = scaler.fit(data_train['Fare'].reshape(-1, 1))\n",
    "df['Fare_scaled'] = scaler.fit_transform(data_train['Fare'].reshape(-1, 1), fare_scale_param)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 处理类别意义的特征数据\n",
    "\n",
    "客舱号“Cabin”的缺失程度太严重了，在整体样本很小，$1-\\frac{204}{891} = 77\\%$的缺失程度的数据不可能有效恢复。我们的灵感是客舱号信息“Cabin”虽然无法提取，但可以将“有没有在客舱”这一信息作为特征提取出来。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def set_cabin_type(p_df):\n",
    "    p_df.loc[(p_df.Cabin.notnull()), 'Cabin'] = \"Yes\"\n",
    "    p_df.loc[(p_df.Cabin.isnull()), 'Cabin'] = \"No\"\n",
    "    return p_df\n",
    "df = set_cabin_type(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于类别意义的特征，数值大小没有任何数量上的意义。就像前面提到的，对于“Pclass”，1和3并不是表示数量关系，而是类别标号。对于类别标号有意义的只有“是”这一类和“不是”这一类。所以，对于所有的类别意义的特征，下面将按类别标号重新建立新的特征，特征的数值只有1和0，标识样本“是”这一类或者“不是”这一类。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pclass_1  Pclass_2  Pclass_3\n",
       "0       0.0       0.0       1.0\n",
       "1       1.0       0.0       0.0\n",
       "2       0.0       0.0       1.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummies_pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')\n",
    "dummies_pclass.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于特征“Embarked”，缺失的数据样本只有两条，对于这两条数据，在按特征标签展开时，每个特征标签数值都为0。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Embarked_C    0.0\n",
       "Embarked_Q    0.0\n",
       "Embarked_S    0.0\n",
       "Name: 61, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummies_embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')\n",
    "dummies_embarked.loc[61]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "预处理其它类别数据，把“Sex”的文本换成数字类别标号。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sex_female</th>\n",
       "      <th>Sex_male</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Sex_female  Sex_male\n",
       "0         0.0       1.0\n",
       "1         1.0       0.0\n",
       "2         1.0       0.0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummies_sex = pd.get_dummies(data_train['Sex'], prefix='Sex')\n",
    "dummies_sex.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来把处理好的数据维度合并进去，不需要的数据维度扔掉："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "df = pd.concat([df, dummies_embarked, dummies_sex, dummies_pclass], axis=1)\n",
    "\n",
    "# noinspection PyUnresolvedReferences\n",
    "df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "到这里为止，输入数据就预处理好了，看下模型将要用哪些特征。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Age_scaled</th>\n",
       "      <th>Fare_scaled</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>Sex_female</th>\n",
       "      <th>Sex_male</th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.592481</td>\n",
       "      <td>-0.502445</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  SibSp  Parch  Age_scaled  Fare_scaled  Embarked_C  Embarked_Q  \\\n",
       "0         0      1      0   -0.592481    -0.502445         0.0         0.0   \n",
       "\n",
       "   Embarked_S  Sex_female  Sex_male  Pclass_1  Pclass_2  Pclass_3  \n",
       "0         1.0         0.0       1.0       0.0       0.0       1.0  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 选择哪些特征作为训练特征\n",
    "train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')\n",
    "train_df.head(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 第三步：训练模型\n",
    "\n",
    "接入模型看看成绩："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "accuracy mean: 0.79919731018\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.77777778,  0.78888889,  0.7752809 ,  0.82022472,  0.78651685,\n",
       "        0.7752809 ,  0.78651685,  0.79775281,  0.83146067,  0.85227273])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from abupy import AbuML\n",
    "\n",
    "train_np = train_df.as_matrix()\n",
    "y = train_np[:, 0]\n",
    "x = train_np[:, 1:]\n",
    "titanic = AbuML(x, y, train_df)\n",
    "\n",
    "titanic.estimator.logistic_regression()\n",
    "titanic.cross_val_accuracy_score()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 课题C：优化LR\n",
    "\n",
    "### 构造非线性特征\n",
    "\n",
    "我们希望逻辑分类模型可以做得更好。前面提到，逻辑分类是一个”线性模型“，所谓线性模型就是把特征对分类结果的作用加起来，也就是说线性模型能表示类似于$y=x_1+x_2$关系的表达式（$y$表示分类结果，$x_1$、$x_2$表示特征对分类的作用），但线性模型无法表示一些非线性的关系如$y=x_1{\\cdot}{x_2}$。所以我们打算**人工构造一些新的特征，弥补线性模型对非线性表达式表达能力的不足**。\n",
    "\n",
    "特征的非线性的表达式可以分为两类：\n",
    "\n",
    "1. 用于表达“数值特征”本身的非线性因素\n",
    "2. 用于表达特征与特征之间存在非线性关联，并且这种关联关系对分类结果有帮助\n",
    "\n",
    "第一种情况是说特征对目标类别的作用不是线性关系。比如两个样本的特征数值是$1$和$3$，对应的，这个特征对分类产生的作用其实是$1^2$和$3^2$，或者$ln1$和$ln3$。\n",
    "\n",
    "就像年纪轻的可能比年纪大的在灾难中更容易存活，但太年幼的又可能不如年轻的易存活。年龄数值的线性数量描述并不能直接描述出特征“年龄”对样本是否能在灾难中存活产生的影响。\n",
    "\n",
    "对于第一种，仅适用于数值特征，对应的构造特征的方式有两种：**函数化和离散化**。函数构造指的是将原有数值的函数输出作为特征，比如觉得特征没有那么强的作用力，可以将特征数据的log值作为特征；数据离散化是指将连续的数值划分成一个个区间，以数值是否在区间内作为特征。\n",
    "\n",
    "举个简单的实现例子，对于特征“Age”，可以构造平方特征，也可以是否满足$Age<=10$这一条件划分区间构造出新特征。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 划分区间\n",
    "df['Child'] = (data_train['Age'] <= 10).astype(int)\n",
    "# 平方\n",
    "df['Age*Age'] = data_train['Age'] * data_train['Age']\n",
    "# 归一化\n",
    "age2_scale_param = scaler.fit(df['Age*Age'].reshape(-1, 1))\n",
    "df['Age*Age_scaled'] = scaler.fit_transform(df['Age*Age'].reshape(-1, 1), age2_scale_param)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接着尝试构造新特征表达特征与特征之间的非线性关联，源自**多项式**的思路。在理论上，变量的无穷多项式$(x_1 + x_2)^n$可以表示$x_1$和$x_2$的所有关系表达式，n越小表示的是$x_1$和$x_2$的越主要的关系表达式。\n",
    "\n",
    "比如：我们觉得“Pclass”数值越大越不容易生存下来，头等舱的遇害人员应该比三等舱的更可能被照顾；同时年龄越大的人也越不容易生存下来，越小的越可能被照顾，会不会这两个特征之间也有一些关联，并且这种关联对生存预测有指导意义呢？\n",
    "\n",
    "我们可以构造一个新的交叉特征“Age * Class”，加入模型中，也可以构造更复杂的$(Age + Class)^n$，从平方到高次方。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df['Age*Class'] = data_train['Age'] * data_train['Pclass']\n",
    "# 归一化\n",
    "age_class_scale_param = scaler.fit(df['Age*Class'].reshape(-1, 1))\n",
    "df['Age*Class_scaled'] = scaler.fit_transform(df['Age*Class'].reshape(-1, 1), age_class_scale_param)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看下模型现在用的特征："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Age_scaled</th>\n",
       "      <th>Fare_scaled</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>Sex_female</th>\n",
       "      <th>Sex_male</th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "      <th>Child</th>\n",
       "      <th>Age*Age_scaled</th>\n",
       "      <th>Age*Class_scaled</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.592481</td>\n",
       "      <td>-0.502445</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.636573</td>\n",
       "      <td>0.031376</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  SibSp  Parch  Age_scaled  Fare_scaled  Embarked_C  Embarked_Q  \\\n",
       "0         0      1      0   -0.592481    -0.502445         0.0         0.0   \n",
       "\n",
       "   Embarked_S  Sex_female  Sex_male  Pclass_1  Pclass_2  Pclass_3  Child  \\\n",
       "0         1.0         0.0       1.0       0.0       0.0       1.0      0   \n",
       "\n",
       "   Age*Age_scaled  Age*Class_scaled  \n",
       "0       -0.636573          0.031376  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# filter加入新增的特征\n",
    "train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*|Child|Age\\*Class_.*')\n",
    "train_df.head(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "新加入的这些特征，对模型的表现是否有提升呢？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "accuracy mean: 0.804752298264\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.8       ,  0.8       ,  0.78651685,  0.84269663,  0.79775281,\n",
       "        0.76404494,  0.79775281,  0.78651685,  0.84269663,  0.82954545])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_np = train_df.as_matrix()\n",
    "y = train_np[:, 0]\n",
    "x = train_np[:, 1:]\n",
    "titanic = AbuML(x, y, train_df)\n",
    "\n",
    "titanic.estimator.logistic_regression()\n",
    "titanic.cross_val_accuracy_score()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 评估特征作用\n",
    "\n",
    "一般而言，机器学习中看一个新特征是否发挥作用，**最常用的方法就是加进去看模型成绩是否提升**。对于LR也可以直接观察模型给特征分配的权重，看特征发挥作用的大小："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "********************LogisticRegression********************\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[-0.410298136384]</td>\n",
       "      <td>SibSp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[-0.173336882199]</td>\n",
       "      <td>Parch</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[-0.208459115049]</td>\n",
       "      <td>Age_scaled</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[0.165577117349]</td>\n",
       "      <td>Fare_scaled</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>Embarked_C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>Embarked_Q</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>[-0.405822408349]</td>\n",
       "      <td>Embarked_S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>[1.99640288087]</td>\n",
       "      <td>Sex_female</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>[-0.715926302128]</td>\n",
       "      <td>Sex_male</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>[0.663404977168]</td>\n",
       "      <td>Pclass_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>Pclass_2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>[-1.03255600599]</td>\n",
       "      <td>Pclass_3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>[1.28640364062]</td>\n",
       "      <td>Child</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>Age*Age_scaled</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>[-0.129278692295]</td>\n",
       "      <td>Age*Class_scaled</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 coef           columns\n",
       "0   [-0.410298136384]             SibSp\n",
       "1   [-0.173336882199]             Parch\n",
       "2   [-0.208459115049]        Age_scaled\n",
       "3    [0.165577117349]       Fare_scaled\n",
       "4               [0.0]        Embarked_C\n",
       "5               [0.0]        Embarked_Q\n",
       "6   [-0.405822408349]        Embarked_S\n",
       "7     [1.99640288087]        Sex_female\n",
       "8   [-0.715926302128]          Sex_male\n",
       "9    [0.663404977168]          Pclass_1\n",
       "10              [0.0]          Pclass_2\n",
       "11   [-1.03255600599]          Pclass_3\n",
       "12    [1.28640364062]             Child\n",
       "13              [0.0]    Age*Age_scaled\n",
       "14  [-0.129278692295]  Age*Class_scaled"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "titanic.importances_coef_pd()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，在训练好的模型中，特征“Child”有效发挥了作用，而“Age\\*Class”、“Age\\*Age”没有什么用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构造特征的数学意义\n",
    "\n",
    "通过人工构造非线性特征，可以弥补线性模型表达能力的不足。这一手段之所以能够生效，背后的原因是：**低维的非线性关系可以在高维空间线性展开**。\n",
    "\n",
    "解释这一观点，让我想起霍金先生的巨著《时间简史》中提及的一个例子：“这正如同看一架在非常多山的地面上空飞行的飞机。虽然它沿着三维空间的直线飞，在二维的地面上它的影子却是沿着一条弯曲的路径。——飞机影子的运动轨迹在二维地表上看到的是一条非线性的曲线，起伏不定，很难用函数表示；但在三维空间中，其运动轨迹仅仅是一条笔直的直线而已，一个简单的线性函数就可以说明。也就是说在二维空间中看到的复杂表达式，当增加一个维度，其表达式可能就变得非常简单了。\n",
    "\n",
    "![](img/1/4/plane_f_2.png)\n",
    "\n",
    "同样的道理，我们可以增加新的特征维度，让分类任务背后的数学表达式变得更简单，让分类模型更容易挖掘出信息——这正是构造新特征有意义的地方：**增加特征维度，构造出模型表达不出来的内在表达式**。对于逻辑分类模型而言，就是通过增加新的非线性特征，完成特征维度的扩展，构造出模型表达不出的非线性的内在关系。\n",
    "\n",
    "逻辑分类因为是线性模型，原型简单，所以有着训练速度快、易分布式部署等特点。现在业界对逻辑分类仍然有着广泛的应用，尤其适合那些数据海量、特征高维并且稀疏的应用场景。比如在一些涉及海量用户的个性化推荐任务中，海量数据上，把每个用户ID作为一个特征，使用逻辑分类就可以快速有效地完成任务目标。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 小结\n",
    "\n",
    "- 线性模型是把每个特征数据按权重加起来，描述特征对分类结果的影响\n",
    "- 预处理数据\n",
    "    - 预处理数值数据\n",
    "    - 预处理类别数据\n",
    "- 新特征可以增加特征维度，构造出模型表达不出来的内在表达式"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
